package day04.tx.app.service;

import day02.LoggerUtils;
import org.springframework.aop.framework.AopContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.io.FileInputStream;
import java.io.FileNotFoundException;

@Service
public class Service6 {

    // 解决方式 1 注入已被代理的对象
//    @Autowired
//    private Service6 proxy;

    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
    public void foo() throws FileNotFoundException {
        LoggerUtils.get().debug("foo");
        // 解决方式 1 使用注入对象调用其他事务方法
//        System.out.println(proxy.getClass());
//        proxy.bar();

        // 解决方式 2 获取,需要开启配置 @EnableAspectJAutoProxy
        // 设置属性： exposeProxy = true
        // 指示代理应该由 AOP 框架作为 ThreadLocal 公开，以便通过
        ((Service6) AopContext.currentProxy()).bar();

        // 解决方式 3 可以通过 CTW,LTW 实现功能增强
        // TODO 待研究。。。

//        问题复现： this.bar() 没有使用代理，导致事务失效
//        System.out.println(this.getClass());
//        bar();
    }

    @Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)
    public void bar() throws FileNotFoundException {
        LoggerUtils.get().debug("bar");
    }
}
